home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 015 / prt2side.arc / PRT2SIDE.PAS < prev   
Pascal/Delphi Source File  |  1985-10-05  |  8KB  |  227 lines

  1. {$U+}
  2. program Print_Two_Sides;
  3.  
  4. (*      A program to print documentation on both sides of the paper.  
  5.  
  6.            Written by: Earl Hall
  7.             (10/4/85)  5619 N. Spaulding #3
  8.                        Chicago, IL  60659
  9.                        CompuServe : 72746,3244
  10.  
  11.  
  12.           This program will print either the 'Right' or 'Left' pages of a 
  13.           print file.  It was written so that I could print the on-disk 
  14.           documentation files provided with "shareware" programs (PC-
  15.           Write, for example) on both sides of the paper.  With it you 
  16.           first send the 'Right' pages to the printer, then turn the paper 
  17.           over for the 'Left' pages.  A little experimentation is still 
  18.           necessary to get the pages matched properly but, in general, the 
  19.           process works quite well.  
  20.  
  21.           The terms 'Right' and 'Left' pages refer to which side of the 
  22.           bound page the printout is being produced for.  (This is all my 
  23.           terminology; my apologies if I'm using these terms incorrectly).  
  24.           The 'Right' pages will have the text printed to the right of the
  25.           bindings.  
  26.           
  27.           Most on-disk documentation files will have, first, a cover sheet 
  28.           followed by a table of contents and then the text.  To handle 
  29.           this kind of situation, you can tell the program how many extra 
  30.           leading 'Right' pages are contained in the document.  For 
  31.           instance, PC-Write's documentation has a cover sheet, then a TOC 
  32.           followed by Page 1 of the Introduction.  For that file I 
  33.           specified that there were 2 extra 'Right' pages, so that the TOC 
  34.           and Page 1 would also be 'Right' pages.  (I'm desperately trying 
  35.           to avoid any "right stuff" puns at the moment, but it's hard.) 
  36.  
  37.           The prompt for the 'lines per page' refers to the number of 
  38.           possible lines that can be printed on the paper.  For normal 
  39.           fanfold paper of 11 inches, printed at 6 lpi this number is 66.  
  40.           The 'lines below TOF' query refers to how many blank lines would 
  41.           be produced below the perforation if a FormFeed character is 
  42.           sent to the printer.  A lot of on-disk documentation is 
  43.           formatted to start at the very top of the page (the print file 
  44.           supplies the necessary blank lines for the proper heading 
  45.           spacing).  Most people align some sort of guide on the print 
  46.           head with the perforation - this usually, in fact, produces 1 
  47.           blank line after the perforation.
  48.  
  49.           The 'how many blanks to add/subtract' prompt is for adjusting 
  50.           left margins.  A positive number will add blanks to the 
  51.           beginning of the line; a negative number will delete that number 
  52.           of CHARACTERS (whether blank or not!) from the beginning of 
  53.           lines.  This action is not sensitive to whether the action is 
  54.           being performed on a 'Right' or 'Left' page.  In other words, it 
  55.           WILL NOT add blanks to right margin of 'Left' pages.  
  56.  
  57.           This program will only work properly if the print file 
  58.           consistently uses either formfeeds or blank lines to do the page 
  59.           advancing.  If the methods are mixed, the program's idea of the 
  60.           position of the current printline will be wrong.  It also will 
  61.           work properly only if the formfeed character is either the first 
  62.           or only character on the line.  
  63.  
  64.           Other than being a little piece of my late-night soul, I hold no 
  65.           claim on this program.  Feel free to modify and distribute it to 
  66.           others.  
  67.  
  68.           P.S.:  The documentation for PC-Write is contained in multiple 
  69.           data files.  To use this program it's best to concatenate (with 
  70.           a COPY  <file>+<file>+... command) all of them into one large
  71.           file.  PC-Write's documentation has to be converted to normal
  72.           text files, with the FILEMAN.COM program provided by Quicksoft,
  73.           before this can be done.
  74. *)
  75.  
  76. const
  77.   ff = #12;
  78.   many_blanks = '                              ';
  79.  
  80. var
  81.   console_input   : string[35];
  82.   temp1, temp2    : integer;
  83.  
  84.   pagelength      : integer;
  85.   print_which     : integer;
  86.   extra_rights    : integer;
  87.   blanks_at_top   : integer;
  88.   left_margin     : integer;
  89.   current_page    : integer;
  90.   lines_printed   : integer;
  91.  
  92.   print_buf       : array [1..2] of string [255];
  93.   title_in        : string [35];
  94.   title_out       : string [35];
  95.   file_in         : text;
  96.   file_out        : text;
  97.  
  98.   procedure increment_page;
  99.   begin
  100.     if extra_rights > 0 then
  101.       extra_rights := extra_rights - 1
  102.     else
  103.       current_page := current_page + 1;
  104.   end;
  105.  
  106. begin
  107.  
  108.   extra_rights   := 0;
  109.   blanks_at_top  := 1;
  110.   pagelength     := 66;
  111.   left_margin    := 0;
  112.   current_page   := 1;
  113.   title_out      := 'LPT1';
  114.  
  115.   LowVideo;
  116.  
  117.   repeat
  118.     clrscr;
  119.     Write('Enter Input filename: ');
  120.     Readln(title_in);
  121.     assign(file_in,title_in);
  122.     {$I-}
  123.     reset(file_in);
  124.     {$I+}
  125.   until ioresult = 0;
  126.  
  127.   Writeln;
  128.   console_input := '';
  129.  
  130.   Write('Output filename? (Press Enter for LPT1) ');
  131.     Readln(console_input);
  132.     if console_input <> '' then
  133.       title_out := console_input;
  134.  
  135.   Writeln;
  136.  
  137.   Write('Print <R>ight or <L>eft pages? ');
  138.  
  139.   repeat
  140.     console_input := '';
  141.     Read(Kbd,console_input[1]);
  142.     console_input[1] := UpCase(console_input[1]);
  143.   until (console_input[1] = 'R') or (console_input[1] = 'L');
  144.  
  145.   if console_input[1] = 'R' then
  146.     begin
  147.       Writeln('Right');
  148.       print_which := 1;
  149.     end
  150.   else
  151.     begin
  152.       Writeln('Left');
  153.       print_which := 0;
  154.     end;
  155.  
  156.   Writeln;
  157.  
  158.   Write('Number of extra leading pages to be ''Right'' pages? (Enter for 0) ');
  159.   Readln(extra_rights);
  160.  
  161.   Writeln;
  162.  
  163.   Write('Lines per page? (Press Enter for 66) ');
  164.   Readln(pagelength);
  165.  
  166.   Writeln;
  167.  
  168.   Write('Printer is positioned how many lines below TOF? (Enter for 1) ');
  169.   Readln(blanks_at_top);
  170.   lines_printed := blanks_at_top;
  171.  
  172.   Writeln;
  173.  
  174.   Write('How many blanks to add/subtract to left margin? (Enter for 0) ');
  175.   Readln(left_margin);
  176.  
  177.   Writeln;
  178.  
  179.  
  180.   assign(file_in,title_in);
  181.   assign(file_out,title_out);
  182.   reset(file_in);
  183.   rewrite(file_out);
  184.  
  185.  
  186.   while not eof(file_in) do
  187.     begin
  188.       readln(file_in,print_buf[1],print_buf[2]);
  189.       for temp1 := 1 to 2 do
  190.         for temp2 := 1 to length(print_buf[temp1]) do
  191.           if print_buf[temp1][temp2] = ff then
  192.             begin
  193.               lines_printed := blanks_at_top;
  194.               increment_page;
  195.             end;
  196.       if current_page mod 2 = print_which then
  197.         begin
  198.           if left_margin = 0 then
  199.             writeln(file_out,print_buf[1],print_buf[2])
  200.           else
  201.             begin
  202.             if print_buf[1][1] = ff then
  203.               begin       { put out ff before adding/stripping blanks }
  204.                 print_buf[1] := copy(print_buf[1],2,255);
  205.                 write(file_out,ff);
  206.               end;
  207.             if left_margin > 0 then
  208.               writeln(file_out,copy(many_blanks,1,left_margin)
  209.                               ,print_buf[1],print_buf[2])
  210.             else
  211.               writeln(file_out,copy(print_buf[1],abs(left_margin - 1),255)
  212.                               ,print_buf[2]);
  213.             end;
  214.         end;
  215.       lines_printed := lines_printed + 1;
  216.       if lines_printed = pagelength then
  217.         begin
  218.           lines_printed := 0;
  219.           increment_page;
  220.         end;
  221.     end;
  222.  
  223.   close (file_in);
  224.   close (file_out);
  225.  
  226. end.
  227.